# -*- coding:utf-8 -*-


"""
QClipboard简介

QClipboard类提供了对系统剪切板的访问，可以在应用程序之间复制和粘贴数据，它的操作类似于QDrag类，并使用类似的数据结构。

获取对全局剪贴板对象的引用，可使用QAppiication类的静态方法：
clipboard = QAppiication.clipboard()

任何类型的MimeData都可以从剪切板复制或粘贴。



QClipboard类的常用方法：

setText( text :str)：将文本放置到剪贴板。
text()：返回剪贴板中的文本或空字符串。
text (type)：返回一个包括两个成员的元组。第一个成员为剪贴板中的文本；第二个为文本的类型。参数可以为 "plain", "html" (HTML), 空字符串(任意类型)。
setImage ( img :QImage)： 将QImage类图像放置到剪贴板。如：
clipboard.setImage (QtGui.QImage ("image.jpg"))

image ()： 返回一个QImage对象
setPixmap(img : QPixmap): 将QPixmap类图像放置到剪贴板。如：
clipboard.setPixmap (QtGui.QPixmap ("image, jpg"))
pixmap()： 返回一个QImage对象。
setMimeData(data :QMimeData): 将MimeData类型数据放置到剪贴板。QMimeData 类可以存放任意类型的数据。
mimeData() : 返回一个QMimeData对象。
clear()： 清空剪贴板数据。

QClipboard类中的常用信号：

dataChanged(): 当剪切板内容发生变化时，发射这个信号。


"""

import sys, os
from common.import_pyside import *


class DemoClipboard(QMainWindow):
    def __init__(self, parent=None):
        super(DemoClipboard, self).__init__(parent)

        # 设置窗口标题
        self.setWindowTitle('实战PySide6: QClipBoard 剪贴板演示')
        # 设置窗口大小
        self.resize(400, 300)

        self.initUi()

        self.clipType = ''

    def initUi(self):
        self.initMenu()
        self.showBox = QLabel()
        self.showBox.setFrameShape(QFrame.Box)
        self.showBox.setLineWidth(1)
        self.showBox.setAlignment(Qt.AlignmentFlag.AlignCenter)

        self.setCentralWidget(self.showBox)

    def initMenu(self):
        mBar = self.menuBar()

        # 文件菜单
        menuFile = mBar.addMenu('文件')
        # 退出
        aExit = QAction('退出', self)
        aExit.triggered.connect(self.close)
        menuFile.addAction(aExit)

        # 编辑菜单
        menuEdit = mBar.addMenu('编辑')
        aCopyText = QAction('复制文本', self)
        aCopyText.triggered.connect(self.onCopyText)
        aCopyHtml = QAction('复制Html文本', self)
        aCopyHtml.triggered.connect(self.onCopyHtml)
        aCopyImage = QAction('复制图像', self)
        aCopyImage.triggered.connect(self.onCopyImage)

        aPaste = QAction('粘贴', self)
        aPaste.triggered.connect(self.onPaste)

        menuEdit.addAction(aCopyText)
        menuEdit.addAction(aCopyHtml)
        menuEdit.addAction(aCopyImage)
        menuEdit.addSeparator()
        menuEdit.addAction(aPaste)

    def onCopyText(self):
        # 设置剪贴板文本
        clipboard = QApplication.clipboard()
        clipboard.setText('这是一段剪贴板文本')

    def onCopyHtml(self):
        mimeData = QMimeData()
        mimeData.setHtml("<b>Bold and <font color=red>Red</font></b>")
        clipboard = QApplication.clipboard()
        clipboard.setMimeData(mimeData)

    def onCopyImage(self):
        clipboard = QApplication.clipboard()
        clipboard.setPixmap(QPixmap(os.path.dirname(__file__) + "/python-logo.png"))

    def onPaste(self):
        clipboard = QApplication.clipboard()
        mimeData = clipboard.mimeData()
        print(mimeData.formats())
        if mimeData.hasFormat('text/plain'):
            self.showBox.setText(clipboard.text())
            # 也可以使用下面方式
            # self.showBox.setText(mimeData.text())
        elif mimeData.hasHtml():
            self.showBox.setText(mimeData.html())
        elif mimeData.hasFormat('application/x-qt-image'):
            self.showBox.setPixmap(clipboard.pixmap())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = DemoClipboard()
    window.show()
    sys.exit(app.exec())
